//package com.ruoyi.td.service.impl;
//
//import com.ruoyi.common.exception.custom.BizException;
//import com.ruoyi.common.utils.JsonUtils;
//import com.ruoyi.td.config.Constants;
//import com.ruoyi.td.dm.*;
//import com.ruoyi.td.service.IDbStructureData;
//import com.ruoyi.td.vo.ThingModelVo;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.PostConstruct;
//import javax.annotation.Resource;
//import java.util.List;
//import java.util.stream.Collectors;
//
//@Service
//@Slf4j
//public class DbStructureDataImpl  implements IDbStructureData {
//    //@Resource
//    //TdRestApi tdRestApi;
//
//
//    @Override
//    public void defineThingModel(ThingModelVo thingModelVo) {
//        //获取物模型中的属性定义
//        List<TdField> fields = FieldParser.parse(thingModelVo);
//
//        String tbName = Constants.getProductPropertySTableName(thingModelVo.getProductKey());
//        //生成sql
//        String sql = TableManager.getCreateSTableSql(tbName,
//                fields,
//                new TdField("device_id", "NCHAR", 50));
//        if (sql == null) {
//            return;
//        }
//
//        //log.info("executing sql:{}", sql);
//
//        ////执行sql
//        //TdResponse response = tdRestApi.execSql(sql);
//        //if (TdResponse.CODE_SUCCESS != response.getCode()) {
//        //    throw new BizException(String.format(
//        //            "create td stable failed,code:%s,desc:%s"
//        //            , response.getCode(), response.getDesc()));
//        //}
//    }
//
//
//    /**
//     * 根据物模型更新超级表结构
//     */
//    @Override
//    public void updateThingModel(ThingModelVo thingModelVo) {
//        try {
//            //获取旧字段信息
//            String tbName = Constants.getProductPropertySTableName(thingModelVo.getProductKey());
//            String sql = TableManager.getDescTableSql(tbName);
//            TdResponse response = tdRestApi.execSql(sql);
//            int code = response.getCode();
//            if (code != TdResponse.CODE_SUCCESS) {
//                if (TdResponse.CODE_TB_NOT_EXIST == code) {
//                    defineThingModel(thingModelVo);
//                    return;
//                }
//
//                throw new BizException("get des table error:" + JsonUtils.toJsonString(response));
//            }
//
//            List<TdField> oldFields = FieldParser.parse(response.getData());
//            List<TdField> newFields = FieldParser.parse(thingModelVo);
//            //对比差异
//
//            //找出新增的字段
//            List<TdField> addFields = newFields.stream().filter((f) -> oldFields.stream()
//                            .noneMatch(old -> old.getName().equals(f.getName())))
//                    .collect(Collectors.toList());
//            if (!addFields.isEmpty()) {
//                sql = TableManager.getAddSTableColumnSql(tbName, addFields);
//                response = tdRestApi.execSql(sql);
//                if (response.getCode() != TdResponse.CODE_SUCCESS) {
//                    throw new BizException("add table column error:" + JsonUtils.toJsonString(response));
//                }
//            }
//
//            //找出修改的字段
//            List<TdField> modifyFields = newFields.stream().filter((f) -> oldFields.stream()
//                            .anyMatch(old ->
//                                    old.getName().equals(f.getName()) //字段名相同
//                                            //字段类型或长度不同
//                                            && (!old.getType().equals(f.getType()) || old.getLength() != f.getLength())
//                            ))
//                    .collect(Collectors.toList());
//
//            if (!modifyFields.isEmpty()) {
//                sql = TableManager.getModifySTableColumnSql(tbName, modifyFields);
//                response = tdRestApi.execSql(sql);
//                if (response.getCode() != TdResponse.CODE_SUCCESS) {
//                    throw new BizException("modify table column error:" + JsonUtils.toJsonString(response));
//                }
//            }
//
//            //找出删除的字段
//            List<TdField> dropFields = oldFields.stream().filter((f) ->
//                            !"time".equals(f.getName()) &&
//                                    !"device_id".equals(f.getName()) && newFields.stream()
//                                    //字段名不是time且没有相同字段名的
//                                    .noneMatch(n -> n.getName().equals(f.getName())))
//                    .collect(Collectors.toList());
//            if (!dropFields.isEmpty()) {
//                sql = TableManager.getDropSTableColumnSql(tbName, dropFields);
//                response = tdRestApi.execSql(sql);
//                if (response.getCode() != TdResponse.CODE_SUCCESS) {
//                    throw new BizException("drop table column error:" + JsonUtils.toJsonString(response));
//                }
//            }
//        }catch (Exception e){
//            log.error("更新物模型表失败", e);
//        }
//    }
//
//    @Override
//    @PostConstruct
//    public void initDbStructure() {
//        log.info("TDENGINE INIT...");
//
//        tdRestApi.execSql("CREATE DATABASE IF NOT EXISTS yl_system KEEP 365 DURATION 10 BUFFER 16 WAL_LEVEL 1;");
//
//
//        //建物模型超级表
//        String sql = TableManager.getCreateSTableSql("thing_model_message", List.of(
//                new TdField("product_key", "NCHAR", 50),
//                new TdField("device_name", "NCHAR", 50),
//                new TdField("group_id", "NCHAR", 50),
//                new TdField("uid", "NCHAR", 50),
//                new TdField("identifier", "NCHAR", 50),
//                new TdField("data", "NCHAR", 1024),
//                new TdField("report_time", "BIGINT", -1)
//        ), new TdField("device_id", "NCHAR", 50));
//        TdResponse response = tdRestApi.execSql(sql);
//        if (response.getCode() != TdResponse.CODE_SUCCESS) {
//            throw new BizException("创建物模型超级表失败:" + JsonUtils.toJsonString(response));
//        }
//
//
//
//    }
//}
